/**
 * 日期处理工具类
 * 基于 dayjs
 */
// @ts-ignore
import dayjs from 'dayjs'
// @ts-ignore
import relativeTime from 'dayjs/plugin/relativeTime'
// @ts-ignore
import duration from 'dayjs/plugin/duration'
// @ts-ignore
import customParseFormat from 'dayjs/plugin/customParseFormat'
import 'dayjs/locale/zh-cn'

// 加载插件
dayjs.extend(relativeTime)
dayjs.extend(duration)
dayjs.extend(customParseFormat)

// 设置语言
dayjs.locale('zh-cn')

/**
 * 日期工具
 */
export const DateUtils = {
  /**
   * 格式化日期
   * @param date 日期
   * @param format 格式
   * @returns 格式化后的日期字符串
   */
  format(date: Date | string | number, format = 'YYYY-MM-DD HH:mm:ss'): string {
    return dayjs(date).format(format)
  },

  /**
   * 相对时间
   * @param date 日期
   * @returns 相对时间字符串
   */
  fromNow(date: Date | string | number): string {
    return dayjs(date).fromNow()
  },

  /**
   * 获取当前时间
   * @returns 当前时间
   */
  now(): Date {
    return dayjs().toDate()
  },

  /**
   * 计算两个日期之间的差值
   * @param date1 日期1
   * @param date2 日期2
   * @param unit 单位
   * @returns 差值
   */
  diff(date1: Date | string | number, date2: Date | string | number, unit: 'second' | 'minute' | 'hour' | 'day' | 'month' | 'year' = 'day'): number {
    return dayjs(date1).diff(dayjs(date2), unit)
  },

  /**
   * 添加时间
   * @param date 日期
   * @param value 值
   * @param unit 单位
   * @returns 新日期
   */
  add(date: Date | string | number, value: number, unit: 'second' | 'minute' | 'hour' | 'day' | 'month' | 'year'): Date {
    return dayjs(date).add(value, unit).toDate()
  },

  /**
   * 减去时间
   * @param date 日期
   * @param value 值
   * @param unit 单位
   * @returns 新日期
   */
  subtract(date: Date | string | number, value: number, unit: 'second' | 'minute' | 'hour' | 'day' | 'month' | 'year'): Date {
    return dayjs(date).subtract(value, unit).toDate()
  },

  /**
   * 日期是否在某个日期之前
   * @param date1 日期1
   * @param date2 日期2
   * @returns 是否在之前
   */
  isBefore(date1: Date | string | number, date2: Date | string | number): boolean {
    return dayjs(date1).isBefore(dayjs(date2))
  },

  /**
   * 日期是否在某个日期之后
   * @param date1 日期1
   * @param date2 日期2
   * @returns 是否在之后
   */
  isAfter(date1: Date | string | number, date2: Date | string | number): boolean {
    return dayjs(date1).isAfter(dayjs(date2))
  },

  /**
   * 日期是否相同
   * @param date1 日期1
   * @param date2 日期2
   * @param unit 比较精度
   * @returns 是否相同
   */
  isSame(date1: Date | string | number, date2: Date | string | number, unit: 'second' | 'minute' | 'hour' | 'day' | 'month' | 'year' = 'day'): boolean {
    return dayjs(date1).isSame(dayjs(date2), unit)
  },

  /**
   * 获取时长
   * @param milliseconds 毫秒数
   * @param format 格式
   * @returns 格式化后的时长
   */
  formatDuration(milliseconds: number, format = 'HH:mm:ss'): string {
    return dayjs.duration(milliseconds).format(format)
  },

  /**
   * 解析时长
   * @param durationStr 时长字符串
   * @param format 格式
   * @returns 毫秒数
   */
  parseDuration(durationStr: string, format = 'HH:mm:ss'): number {
    const parts = durationStr.split(':').map(Number)
    let milliseconds = 0
    
    if (parts.length === 3) { // HH:mm:ss
      milliseconds = parts[0] * 3600000 + parts[1] * 60000 + parts[2] * 1000
    } else if (parts.length === 2) { // mm:ss
      milliseconds = parts[0] * 60000 + parts[1] * 1000
    }
    
    return milliseconds
  },

  /**
   * 将时间戳格式化为时间轴显示的时间
   * @param milliseconds 毫秒数
   * @returns 格式化后的时间
   */
  formatTimelineTime(milliseconds: number): string {
    const totalSeconds = Math.floor(milliseconds / 1000)
    const hours = Math.floor(totalSeconds / 3600)
    const minutes = Math.floor((totalSeconds % 3600) / 60)
    const seconds = totalSeconds % 60
    const ms = Math.floor((milliseconds % 1000) / 10) // 只取两位

    if (hours > 0) {
      return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}.${ms.toString().padStart(2, '0')}`
    } else {
      return `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}.${ms.toString().padStart(2, '0')}`
    }
  },

  /**
   * 解析时间轴时间
   * @param timeStr 时间字符串
   * @returns 毫秒数
   */
  parseTimelineTime(timeStr: string): number {
    const parts = timeStr.split(':')
    let hours = 0, minutes = 0, seconds = 0, ms = 0
    
    if (parts.length === 3) { // hh:mm:ss.ms
      hours = parseInt(parts[0], 10)
      minutes = parseInt(parts[1], 10)
      const secParts = parts[2].split('.')
      seconds = parseInt(secParts[0], 10)
      ms = secParts.length > 1 ? parseInt(secParts[1], 10) * 10 : 0 // 两位ms转为毫秒
    } else if (parts.length === 2) { // mm:ss.ms
      minutes = parseInt(parts[0], 10)
      const secParts = parts[1].split('.')
      seconds = parseInt(secParts[0], 10)
      ms = secParts.length > 1 ? parseInt(secParts[1], 10) * 10 : 0
    }
    
    return hours * 3600000 + minutes * 60000 + seconds * 1000 + ms
  }
} 